package com.zwh.se.collection.concurrent.blocking_queue;

import java.util.concurrent.PriorityBlockingQueue;

/**
 * @author yexi
 * PriorityBlockingQueue:带有优先级的阻塞队列。优先级队列，意味着队列有先后顺序的，数据有不同的权重。
 * 无界的队列，没有长度限制，但是在你不手动指定长度的时候，默认初始长度为11。
 * 当然随着数据的不断加入，底层Object[]数组会自动扩容，直到内存全部消耗殆尽了，导致 OutOfMemoryError内存溢出 程序才会结束。
 *
 * 这个所谓的优先级,指的其实是通过比较器的比较规则来得出的顺序,谁在前则先取
 * PriorityBlockingQueue并不会像treeMap一样在插入时就维护优先级,而仅仅是取数据的优先级
 */
@SuppressWarnings({"rawtypes", "unchecked"})
public class PriorityBlockingQueueDemo {
    public static void main(String[] args) throws InterruptedException {
        PriorityBlockingQueue priorityBlockingQueue = new PriorityBlockingQueue();
        try {
            priorityBlockingQueue.put(null);
        } catch (NullPointerException e) {
            //依旧是不能放入null元素
            System.out.println("\033[31;4m" + e + "\033[0m");
        }
        try {
            priorityBlockingQueue.put(new Object());
        } catch (ClassCastException e) {
            //也不允许放入不可比较的对象(对象必须实现内部比较器或者外部比较器)
            System.out.println("\033[31;4m" + e + "\033[0m");
        }
        priorityBlockingQueue.put("nana");
        priorityBlockingQueue.put("lulu");
        priorityBlockingQueue.put("feifei");
        priorityBlockingQueue.put("mingming");
        //可以发现结果并没有按照优先级顺序排列
        System.out.println(priorityBlockingQueue);
        //从取的结果可以看出,这个优先级队列并不是在put数据的时候计算谁在前谁在后,而是取数据的时候,才真正判断谁在前谁在后
        System.out.println(priorityBlockingQueue.take());
        System.out.println(priorityBlockingQueue.take());
        System.out.println(priorityBlockingQueue.take());
        System.out.println(priorityBlockingQueue.take());


    }
}
